home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / vbdatabs / hexdump.cpp < prev    next >
C/C++ Source or Header  |  1999-03-17  |  18KB  |  646 lines

  1. // ------------------------------- //
  2. // -------- Start of File -------- //
  3. // ------------------------------- //
  4. // ----------------------------------------------------------- // 
  5. // C++ Source Code File Name: hexdump.cpp 
  6. // Compiler Used: MSVC40, DJGPP 2.7.2.1, GCC 2.7.2.1, HP CPP 10.24
  7. // Produced By: Doug Gaer 
  8. // File Creation Date: 02/13/1996 
  9. // Date Last Modified: 03/17/1999
  10. // ----------------------------------------------------------- // 
  11. // ------------- Program description and details ------------- // 
  12. // ----------------------------------------------------------- // 
  13. /*
  14. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
  15. THE ENTIRE RISK OF THE QUALITY AND PERFORMANCE OF THIS SOFTWARE
  16. IS WITH YOU. SHOULD ANY ELEMENT OF THIS SOFTWARE PROVE DEFECTIVE,
  17. YOU WILL ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR
  18. CORRECTION.
  19.   
  20. This program is used to display the contents of a specified
  21. file, in both hexadecimal and ASCII, to the console. 
  22. */
  23. // ----------------------------------------------------------- // 
  24. #include <iostream.h>
  25. #include <fstream.h>
  26. #include <ctype.h>
  27. #include <iomanip.h>
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <string.h>
  31. #include "hxcrc.h"
  32.  
  33. // Define this macro for DOS file opens (the default is UNIX)
  34. // #ifndef __DOS__
  35. // #define __DOS__
  36. // #endif
  37.  
  38. // Hexdump version number and program name
  39. const double HexdumpVersionNumber = 1031.101;
  40. const char *ProgramName = "hexdump";
  41.  
  42. // Program constants
  43. const int MAX_LINE = 255;  // Maximum characters per line
  44. const int hxBuffSize = 16; // Maximum number of bytes per line
  45. const int decBuffSize = 8; // Maximum number of bytes per line
  46.  
  47. // Constants for text parser
  48. const int MAXWORDLENGTH = 255;
  49. const int MAXWORDS = 255;
  50.  
  51. // Program globals
  52. char in_file[MAX_LINE];    // Input file 
  53. char out_file[MAX_LINE];   // Optional output file name
  54. int prompting = 0;         // Enable prompting during console dump
  55. int use_console = 1;       // Dump to console if no output file is specified
  56. int decimal_mode = 0;      // Display in decimal mode (Default is HEX)
  57. int building_bin_file = 0; // True if building binary file from text file
  58. int strip_comments = 0;    // True if not adding comments
  59. int display_crc32 = 0;     // True if displaying 32-bit crc checksum
  60. int display_crc16 = 0;     // True if displaying 16-bit crc checksum
  61. int NumLines = 8;          // Default maximum number of lines to display
  62.  
  63. // Table for HEX to binary conversions
  64. const char *bintab[16] = {
  65.   "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
  66.   "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
  67. };
  68.  
  69. // Program Functions 
  70. void ProcessArgs(int argc, char *argv[]);
  71. void HelpMessage(const char *program_name, const double version_number);
  72. int HexFileDump(fstream &infile, ostream &stream);
  73. int DecFileDump(fstream &infile, ostream &stream);
  74. void BuildBinaryFile(char *ifname, char *ofname);
  75. void TruncateLine(char *line, char tline[MAX_LINE], char delimiter1 = '\t',
  76.           char delimiter2 = ';');
  77. int text_parse(char *string, char words[MAXWORDS][MAXWORDLENGTH],
  78.            int*numwords, char sepchar1 = ' ', char sepchar2 = ' ');
  79.  
  80. void HelpMessage(const char *program_name, const double version_number)
  81. {
  82.   char vbuffer[255];
  83.   sprintf(vbuffer, "%.3f", version_number);
  84.   cout << endl;
  85.   cout << "Hexadecimal file dump program version "
  86.        << vbuffer  << endl;
  87.   cout << "Usage: " << program_name << " [switches] infile "
  88.        << "outfile (optional)" << endl;
  89.   cout << "Switches:  -?      = Display this help message." << endl;
  90.   cout << "           -c      = Display a 32-bit CRC checksum value." << endl;
  91.   cout << "           -C      = Display a 16-bit CRC checksum value." << endl;
  92.   cout << "           -d      = Display in decimal mode (Default is HEX)."
  93.        << endl;
  94.   cout << "           -p#     = Prompting after displaying # line: -p10"
  95.        << endl;
  96.   cout << "           -r      = Rebuild binary file from hex dump text file.\n"
  97.        << "                     Only works for files created in hex mode."   
  98.        << endl;
  99.   cout << "           -s      = Strip comments from output." << endl;
  100.   cout << endl;
  101.   cout << "           -x      = Convert 32-bit HEX number to DEC: -Xfefe"
  102.        << endl;
  103.   cout << "           -X      = Convert signed 32-bit HEX number to DEC."
  104.        << endl;
  105.   cout << "           -B      = Convert 32-bit HEX number to binary: -Bfefe"
  106.        << endl;
  107.   cout << "           -D      = Convert DEC number to HEX: -D23" << endl;
  108.   cout << endl;
  109.   exit(0);
  110. }
  111.  
  112. void ProcessArgs(int argc, char *argv[])
  113. // Process the program's argument list
  114. {
  115.   int i, ibuf;
  116.   char *sbuf;
  117.   unsigned long ulbuf, bbuf;
  118.   long lbuf;
  119.   
  120.   for(i = 1; i < argc; i++ ) {
  121.     if(*argv[i] == '-') {
  122.       char sw = *(argv[i] +1);
  123.       switch(sw) {
  124.     case '?' :
  125.       HelpMessage(ProgramName, HexdumpVersionNumber);
  126.       break;
  127.  
  128.     case 'c':
  129.       display_crc32 = 1;
  130.       break;
  131.  
  132.     case 'C':
  133.       display_crc16 = 1;
  134.       break;
  135.  
  136.     case 'p' :
  137.       prompting = 1;
  138.       ibuf = atoi(&argv[i][2]);
  139.       if(ibuf > 0) NumLines = ibuf; 
  140.       break;
  141.  
  142.     case 'd' :
  143.       decimal_mode = 1;
  144.       break;
  145.  
  146.     case 'r' :
  147.       building_bin_file = 1;
  148.       break;
  149.  
  150.     case 's' :
  151.       strip_comments = 1;
  152.       break;
  153.  
  154.     case 'x' : {
  155.       sbuf = &argv[i][2];
  156.       cout << endl;
  157.       sscanf(sbuf, "%x", &ulbuf);
  158.       cout.setf(ios::uppercase);
  159.       cout << "0x" << hex << ulbuf << " = " << dec << ulbuf << endl;
  160.       cout << endl;
  161.       exit(0);
  162.       break;
  163.     }
  164.       
  165.     case 'X' : {
  166.       sbuf = &argv[i][2];
  167.       cout << endl;
  168.       sscanf(sbuf, "%x", &lbuf);
  169.       cout.setf(ios::uppercase);
  170.       cout << "0x" << hex << lbuf << " = " << dec << lbuf << endl;
  171.       cout << endl;
  172.       exit(0);
  173.       break;
  174.     }
  175.     
  176.     case 'D' : {
  177.       sbuf = &argv[i][2];
  178.       cout << endl;
  179.       sscanf(sbuf, "%u", &ulbuf);
  180.       cout.setf(ios::uppercase);
  181.       cout << ulbuf << " = " << "0x" << hex << ulbuf << endl;
  182.       cout << endl;
  183.       exit(0);
  184.       break;
  185.     }
  186.  
  187.     case 'B' : {
  188.       sbuf = &argv[i][2];
  189.       cout << endl;
  190.       sscanf(sbuf, "%x", &ulbuf);
  191.       cout.setf(ios::uppercase);
  192.       cout << "0x" << hex << ulbuf << " = ";
  193.       bbuf = (ulbuf & 0xf0000000)>>28;
  194.       cout << bintab[bbuf] << ' ';
  195.       bbuf = (ulbuf & 0xf000000)>>24;
  196.       cout << bintab[bbuf] << ' ';
  197.       bbuf = (ulbuf & 0xf00000)>>20;
  198.       cout << bintab[bbuf] << ' ';
  199.       bbuf = (ulbuf & 0xf0000)>>16;
  200.       cout << bintab[bbuf] << ' ';
  201.       bbuf = (ulbuf & 0xf000)>>12;
  202.       cout << bintab[bbuf] << ' ';
  203.       bbuf = (ulbuf & 0xf00)>>8;
  204.       cout << bintab[bbuf] << ' ';
  205.       bbuf = (ulbuf & 0xf0)>>4;
  206.       cout << bintab[bbuf] << ' '; 
  207.       bbuf = ulbuf & 0x0f;
  208.       cout << bintab[bbuf] << endl; 
  209.       cout << endl;
  210.       exit(0);
  211.       break;
  212.     }
  213.     
  214.     default:
  215.       cerr << endl;
  216.       cerr << "Unknown switch " << argv[i] << endl;
  217.       cerr << "Exiting..." << endl;
  218.       cerr << endl;
  219.       exit(0);
  220.       break;
  221.       }
  222.     }
  223.     else { 
  224.       strcpy(in_file, argv[i]);      // Input file name
  225.       if(argv[i+1]) {
  226.     strcpy(out_file, argv[i+1]); // Output file name
  227.     break;
  228.       }
  229.       else
  230.     break;
  231.     }
  232.   }
  233. }
  234.  
  235. int HexFileDump(fstream &infile, ostream &stream)
  236. {
  237.   register int i, j;
  238.   int count = 0;
  239.   char c[hxBuffSize];
  240.  
  241.   // Print all text in upper case characters
  242.   stream.setf(ios::uppercase);
  243.  
  244.   while(!infile.eof()) {
  245.  
  246.     for(i = 0; i < hxBuffSize && !infile.eof(); i++) {
  247.       infile.get(c[i]);
  248.     }
  249.       
  250.     if(i < hxBuffSize) i--; // Get rid of eof;
  251.       
  252.     for(j = 0; j < i; j++) {
  253.       long xx = (long)c[j];
  254.  
  255.       // Set fill chars and reset first 24 bits for one byte display
  256.       stream << setfill('0') << setw(2) << hex << (xx & 0xFF);
  257.       stream << " "; // Print one space between the bytes
  258.     }
  259.  
  260.     // Set the line spacing to a minimum of bytes per line
  261.     for(; j < hxBuffSize; j++) stream << "   "; // Insert 3 spaces
  262.  
  263.     if(!strip_comments) {
  264.       // Separate hex output by one tab and denote comments
  265.       // with a semicolon.
  266.       stream << "\t" << "; ";
  267.       
  268.       // Filter out any non-printable characters
  269.       for(j = 0; j < i; j++)
  270.     if(isgraph(c[j])) stream << c[j];